#pragma once

#include "kernel/interfaces/ILogger.h"
#include <memory>
#include <string>
#include <unordered_map>
#include <mutex>

// 前向声明
namespace infrastructure {
namespace logging {
    class SpdlogLoggerFactory;
}
}

namespace infrastructure {
namespace factories {

/**
 * @brief 日志工厂 - 管理多个spdlog日志器
 * @details 基于真正的SpdlogLoggerFactory，为业务层提供简洁的日志器获取接口
 */
class LoggerFactory
{
public:
    LoggerFactory();
    ~LoggerFactory();

    /**
     * @brief 获取指定名称的日志器
     * @param loggerName 日志器名称，如："UserService", "ConfigService", "TaskService"
     * @return 指定的日志器实例
     */
    std::shared_ptr<kernel::ILogger> getLogger(const std::string& loggerName);

    /**
     * @brief 获取默认日志器
     * @return 默认日志器实例
     */
    std::shared_ptr<kernel::ILogger> getDefaultLogger();

    /**
     * @brief 创建专用日志器（简化版本）
     * @param loggerName 日志器名称
     * @param logLevel 日志级别（可选，默认info）
     * @return 创建的日志器实例
     */
    std::shared_ptr<kernel::ILogger> createLogger(
        const std::string& loggerName,
        const std::string& logLevel = "info"
    );

    /**
     * @brief 注册已存在的日志器
     * @param loggerName 日志器名称
     * @param logger 日志器实例
     */
    void registerLogger(const std::string& loggerName, std::shared_ptr<kernel::ILogger> logger);

    /**
     * @brief 检查指定名称的日志器是否存在
     */
    bool hasLogger(const std::string& loggerName) const;

private:
    std::unique_ptr<infrastructure::logging::SpdlogLoggerFactory> m_spdlogFactory;
    std::unordered_map<std::string, std::shared_ptr<kernel::ILogger>> m_loggers;
    std::shared_ptr<kernel::ILogger> m_defaultLogger;
    mutable std::mutex m_mutex;

    // 预定义的日志器名称常量
public:
    static const std::string DEFAULT_LOGGER;
    static const std::string USER_SERVICE_LOGGER;
    static const std::string CONFIG_SERVICE_LOGGER;
    static const std::string TASK_SERVICE_LOGGER;
    static const std::string VEHICLE_SERVICE_LOGGER;
    static const std::string SCHEDULING_SERVICE_LOGGER;
};

} // namespace factories
} // namespace infrastructure